package ar.edu.caece.pl.asin.model.impl;

import ar.edu.caece.pl.alex.model.IToken;
import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.manager.impl.AbstractAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;

public class Termino extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public Termino ( ITokenStream ts ) {
		super(ts, false);
	}
	public Termino ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/** 
	 * Devuelve true si reconoce un termino de una expresion
	 */
	public boolean reconocer () {
		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer Termino:");		//TODO pasarlo a accion semantica
		//----------------------------------------------
		
		/* <TERMINO> -> <FACTOR> <T'> */
		

		if ( Factor.primeros(this.getTokenSiguiente()) ) {
			
			//Reconocer Factor
			IAnalizadorSintactico factor = new Factor(this.tokenStream, this.debugMode);
			recognized &= factor.reconocer();
			
			//Reconocer T'
			IAnalizadorSintactico t1 = new T1(this.tokenStream, this.debugMode);
			recognized &= t1.reconocer();
			
			
		} else {
			
			//No deberia darse el caso, pero si se llama a reconocer() en un estado incorrecto deberia salir por aqui
			em.error("Se esperaba un factor", this.getTokenSiguiente());
			
			//Tratamiento de errores
			em.recover(this.getClass(), this.tokenStream);
			return false;
		}
		return recognized;
	}
	
	public static boolean primeros(IToken token) {
		return  Factor.primeros(token);
	}

}
